Site Map

coords = site_data %>%
  dplyr::select(site, long, lat, collection_temp) %>%
  drop_na(collection_temp) %>% 
  distinct() # <1>

map_data("world") %>% 
  filter(region %in% c("USA", "Canada")) %>% 
  ggplot() + 
  geom_polygon(aes(x = long, y = lat, group = group),
               fill = "lightgrey") + 
  coord_map(xlim = c(-110,-60),
            ylim = c(25, 55)) + 
  geom_point(data = coords,
             mapping = aes(x = long, y = lat, colour = collection_temp),
             size = 3) +
  scale_colour_viridis_c(option = "F") + 
  labs(x = "Longitude", 
       y = "Latitude",
       colour = "Temp.") + 
  theme_matt() + 
  theme(legend.position = "right")

  1. Test comment

CTmax Data

ctmax_temp_plot = ctmax_data %>% 
  mutate(species = str_replace(species, "_", " "),
         species = str_to_sentence(species)) %>% 
  ggplot(aes(x = collection_temp, y = ctmax)) + 
  geom_smooth(method = "lm", colour = "black") + 
  geom_point(aes(colour = species)) + 
  labs(x = "Collection Temp. (°C)", 
       y = "CTmax (°C)") + 
  scale_colour_manual(values = skisto_cols) + 
  theme_matt() + 
  theme(legend.position = "right")

ctmax_lat_plot = ctmax_data %>% 
  mutate(species = str_replace(species, "_", " "),
         species = str_to_sentence(species)) %>% 
  ggplot(aes(x = lat, y = ctmax)) + 
  geom_smooth(method = "lm", colour = "black") + 
  geom_point(aes(colour = species)) + 
  labs(x = "Latitude", 
       y = "CTmax (°C)") + 
  scale_colour_manual(values = skisto_cols) + 
  theme_matt() + 
  theme(legend.position = "right")

ctmax_elev_plot = ctmax_data %>% 
  mutate(species = str_replace(species, "_", " "),
         species = str_to_sentence(species)) %>% 
  ggplot(aes(x = elevation, y = ctmax)) + 
  geom_smooth(method = "lm", colour = "black") + 
  geom_point(aes(colour = species)) +
  labs(x = "Elevation (m)", 
       y = "CTmax (°C)") +
  scale_colour_manual(values = skisto_cols) + 
  theme_matt() + 
  theme(legend.position = "right")

ggpubr::ggarrange(ctmax_temp_plot, ctmax_lat_plot, ctmax_elev_plot, common.legend = T, legend = "right", nrow = 1)

ctmax_data %>% 
  mutate(species = str_replace(species, "_", " "),
         species = str_to_sentence(species)) %>% 
  ggplot(aes(x = collection_temp, y = ctmax)) + 
  facet_wrap(species~.) + 
  geom_smooth(method = "lm", colour = "black") + 
  geom_point() + 
  labs(x = "Collection Temp. (°C)",
       y = "CTmax (°C)") + 
  theme_matt() + 
  theme(legend.position = "none")

ctmax_data %>% 
  filter(str_detect(species, pattern = "skisto") | 
           str_detect(species, pattern = "lepto") | 
           str_detect(species, pattern = "aglao")) %>% 
  mutate(species = str_replace(species, "_", " "),
         species = str_to_sentence(species)) %>% 
  group_by(collection_date, species, collection_temp) %>% 
  summarise(mean_ctmax = mean(ctmax),
            ctmax_sd = sd(ctmax),
            ctmax_n = n(), 
            ctmax_se = ctmax_sd / sqrt(ctmax_n)) %>% 
  ggplot(aes(x = collection_temp, y = mean_ctmax, colour = species)) + 
  geom_smooth(method = "lm", se=F, linewidth = 2) + 
  geom_point(size = 2) + 
  geom_errorbar(aes(ymin = mean_ctmax - ctmax_se, 
                    ymax = mean_ctmax + ctmax_se),
                width = 0.3, linewidth = 1) + 
  labs(x = "Collection Temp. (°C)",
       y = "CTmax (°C)") + 
  scale_colour_manual(values = skisto_cols) + 
  theme_matt() + 
  theme(legend.position = "right")

ctmax_data %>% 
  mutate(species = str_replace(species, "_", " "),
         species = str_to_sentence(species)) %>% 
  ggplot(aes(x = collection_temp, y = size)) + 
  facet_wrap(species~.) + 
  geom_smooth(method = "lm", colour = "black") + 
  geom_point() + 
  labs(x = "Collection Temp. (°C)",
       y = "Prosome Length (mm)") + 
  theme_matt() + 
  theme(legend.position = "none")

ctmax_data %>% 
  mutate(species = str_replace(species, "_", " "),
         species = str_to_sentence(species)) %>% 
  ggplot(aes(x = collection_temp, y = egg_volume)) + 
  facet_wrap(species~.) + 
  geom_smooth(method = "lm", colour = "black") + 
  geom_point() + 
  labs(x = "Collection Temp. (°C)",
       y = "Egg Volume (mm^3)") + 
  theme_matt() + 
  theme(legend.position = "none")

ctmax_data %>% 
  select(elevation, collection_temp) %>% 
  distinct() %>% 
  ggplot(aes(x = elevation, y = collection_temp)) + 
  geom_point(size = 3) +
  labs(x = "Elevation (m)", 
       y = "Collection Temp. (°C)") + 
  theme_matt()

ggplot(ctmax_data, aes(x = size, y = ctmax, colour = species)) + 
  facet_wrap(.~species) + 
  geom_point() + 
  theme_matt() + 
  theme(legend.position = "none")


ggplot(ctmax_data, aes(x = size, y = fecundity, colour = species)) + 
  facet_wrap(.~species) + 
  geom_point() + 
  theme_matt() + 
  theme(legend.position = "none")

ggplot(ctmax_data, aes(x = size, y = total_egg_volume)) + 
  geom_smooth(method = "lm", formula = y ~ exp(x)) + 
  geom_point()+
  labs(x = "Prosome Length (mm)",
       y = "Total Egg Volume (mm^3)") + 
  theme_matt()


ggplot(ctmax_data, aes(x = size, y = total_egg_volume)) + 
  facet_wrap(.~species) + 
  geom_point()+
  #geom_smooth() + 
  labs(x = "Prosome Length (mm)",
       y = "Total Egg Volume (mm^3)") + 
  theme_matt()

ctmax_data %>% 
  filter(species == "skistodiaptomus_pallidus") %>%
  # group_by(site) %>% 
  # summarise(size = mean(size, na.rm = T), 
  #          total_egg_volume = mean(total_egg_volume, na.rm = T)) %>% 
ggplot(aes(x = size, y = total_egg_volume)) + 
  geom_smooth(method = "lm", formula = y ~ exp(x), 
              colour = "black") + 
  geom_point(aes(colour = site))+
  labs(x = "Prosome Length (mm)",
       y = "Total Egg Volume (mm^3)") + 
  theme_matt() + 
  theme(legend.position = "right")

model_data = ctmax_data %>% 
  mutate("genus" = str_split_fixed(species, pattern = "_", n = 2)[,1],
         genus = tools::toTitleCase(genus),
         "doy" = yday(collection_date)) %>% 
  select(site, collection_date, doy, collection_temp, lat, elevation, species, genus, sample_id, fecundity, total_egg_volume, size, ctmax) %>% 
  filter(genus != "MH") %>%  
  mutate(total_egg_volume = if_else(is.na(total_egg_volume), 0, total_egg_volume),
         collection_temp_sc = scale(collection_temp),
         lat_sc = scale(lat), 
         elevation_sc = scale(elevation),
         tev_sc = scale(total_egg_volume)) 

ctmax_temp.model = lm(data = model_data, 
                      ctmax ~ genus + collection_temp + lat + elevation + total_egg_volume)

#MuMIn::dredge(ctmax_temp.model)

performance::check_model(ctmax_temp.model)

 
summary(ctmax_temp.model)
## 
## Call:
## lm(formula = ctmax ~ genus + collection_temp + lat + elevation + 
##     total_egg_volume, data = model_data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.8997 -0.4819  0.0975  0.5955  2.5533 
## 
## Coefficients:
##                        Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          43.1084072  1.0485289  41.113  < 2e-16 ***
## genusLeptodiaptomus  -3.1086251  0.3240655  -9.593  < 2e-16 ***
## genusSkistodiaptomus -1.5305123  0.3046859  -5.023 7.47e-07 ***
## collection_temp       0.1464862  0.0157380   9.308  < 2e-16 ***
## lat                  -0.1994596  0.0189392 -10.532  < 2e-16 ***
## elevation            -0.0002449  0.0000911  -2.688  0.00747 ** 
## total_egg_volume     33.6408738  8.1880105   4.109 4.77e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.9213 on 428 degrees of freedom
## Multiple R-squared:  0.5743, Adjusted R-squared:  0.5684 
## F-statistic: 96.24 on 6 and 428 DF,  p-value: < 2.2e-16

emmeans::emmeans(ctmax_temp.model, specs = "genus") %>% 
  data.frame() %>% 
  mutate(genus = fct_reorder(genus, .x = emmean, .desc = T)) %>% 
  ggplot(aes(genus, y = emmean)) + 
  geom_point(size = 4) + 
  geom_errorbar(aes(ymin = emmean - SE, ymax = emmean + SE), 
                width = 0.2, linewidth = 1) + 
  labs(x = "") + 
  theme_matt() + 
  theme(axis.text.x = element_text(angle = 300, hjust = 0, vjust = 0.5))

ctmax_data %>% 
  mutate(group_id = paste(site, species)) %>% 
  ggplot(aes(x = fecundity, y = site, fill = site)) + 
  geom_density_ridges(bandwidth = 2,
                      jittered_points = TRUE, 
                      point_shape = 21,
                      point_size = 1,
                      point_colour = "grey30",
                      point_alpha = 0.6,
                      alpha = 0.9,
                      position = position_points_jitter(
                        height = 0.1, width = 0)) + 
  scale_fill_viridis_d(option = "E", direction = -1) + 
  theme_matt() + 
  theme(legend.position = "none")

ctmax_data %>% 
  mutate(group_id = paste(site, species)) %>% 
  ggplot(aes(x = size, y = site, fill = site, group = group_id)) + 
  geom_density_ridges(bandwidth = 0.02,
                      jittered_points = TRUE, 
                      point_shape = 21,
                      point_size = 1,
                      point_colour = "grey30",
                      point_alpha = 0.6,
                      alpha = 0.9,
                      position = position_points_jitter(
                        height = 0.1, width = 0)) + 
  scale_fill_viridis_d(option = "E", direction = -1) + 
  theme_matt() + 
  theme(legend.position = "none")

ctmax_data %>% 
  mutate(group_id = paste(site, species)) %>% 
  ggplot(aes(x = ctmax, y = site, fill = site, group = group_id)) + 
  geom_density_ridges(bandwidth = 0.3,
                      jittered_points = TRUE, 
                      point_shape = 21,
                      point_size = 1,
                      point_colour = "grey30",
                      point_alpha = 0.6,
                      alpha = 0.9,
                      position = position_points_jitter(
                        height = 0.1, width = 0)) + 
  scale_fill_viridis_d(option = "E", direction = -1) + 
  labs(x = "CTmax (°C)") + 
  theme_matt() + 
  theme(legend.position = "none")

LS0tCnRpdGxlOiBEaWFwdG9taWQgVGhlcm1hbCBMaW1pdHMKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICAgICAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgICAgICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgICAgICAgIHRvYzogdHJ1ZQogICAgICAgICAgdG9jX2Zsb2F0OiB0cnVlCiAgZ2l0aHViX2RvY3VtZW50OgogICAgICAgICAgaHRtbF9wcmV2aWV3OiBmYWxzZQogICAgICAgICAgdG9jOiB0cnVlCiAgICAgICAgICB0b2NfZGVwdGg6IDMKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1ULCBtZXNzYWdlID0gRiwgd2FybmluZyA9IEYsIGVjaG8gPSBGfQprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgZWNobyA9IGtuaXRyOjppc19odG1sX291dHB1dCgpLAogIGZpZy5hbGlnbiA9ICJjZW50ZXIiLAogIGZpZy5wYXRoID0gIi4uL0ZpZ3VyZXMvbWFya2Rvd24vIiwKICBkZXYgPSBjKCJwbmciLCAicGRmIiksCiAgbWVzc2FnZSA9IEZBTFNFLAogIHdhcm5pbmcgPSBGQUxTRSwKICBjb2xsYXBzZSA9IFQKKQoKdGhlbWVfbWF0dCA9IGZ1bmN0aW9uKGJhc2Vfc2l6ZSA9IDE4LAogICAgICAgICAgICAgICAgICAgICAgZGFya190ZXh0ID0gImdyZXkyMCIpewogIG1pZF90ZXh0IDwtICBtb25vY2hyb21lUjo6Z2VuZXJhdGVfcGFsZXR0ZShkYXJrX3RleHQsICJnb19saWdodGVyIiwgbl9jb2xvdXJzID0gNSlbMl0KICBsaWdodF90ZXh0IDwtICBtb25vY2hyb21lUjo6Z2VuZXJhdGVfcGFsZXR0ZShkYXJrX3RleHQsICJnb19saWdodGVyIiwgbl9jb2xvdXJzID0gNSlbM10KICAKICBnZ3B1YnI6OnRoZW1lX3B1YnIoYmFzZV9mYW1pbHk9InNhbnMiKSAlK3JlcGxhY2UlIAogICAgdGhlbWUoCiAgICAgIHBhbmVsLmJhY2tncm91bmQgID0gZWxlbWVudF9yZWN0KGZpbGw9InRyYW5zcGFyZW50IiwgY29sb3VyPU5BKSwgCiAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksIAogICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksCiAgICAgIGxlZ2VuZC5rZXkgPSBlbGVtZW50X3JlY3QoZmlsbD0idHJhbnNwYXJlbnQiLCBjb2xvdXI9TkEpLAogICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG91ciA9IG1pZF90ZXh0LCBsaW5laGVpZ2h0ID0gMS4xKSwKICAgICAgdGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGJhc2Vfc2l6ZSAqIDEuNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gZGFya190ZXh0KSwKICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSBiYXNlX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBtaWRfdGV4dCksCiAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gYmFzZV9zaXplICogMS4yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gdW5pdChjKDMsIDAsIDAsIDApLCAibW0iKSksCiAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gYmFzZV9zaXplICogMS4yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gdW5pdChjKDAsIDUsIDAsIDApLCAibW0iKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmdsZSA9IDkwKSwKICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT1iYXNlX3NpemUgKiAwLjkpLAogICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGJhc2Vfc2l6ZSAqIDAuOSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlID0gImJvbGQiKSwKICAgICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oMC4yNSwgMC4yNSwgMC4yNSwgMC4yNSwiY20iKQogICAgKQp9Cgp0aGVtZV9tYXR0X2ZhY2V0cyA9IGZ1bmN0aW9uKGJhc2Vfc2l6ZSA9IDE4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhcmtfdGV4dCA9ICJncmV5MjAiKXsKICBtaWRfdGV4dCA8LSAgbW9ub2Nocm9tZVI6OmdlbmVyYXRlX3BhbGV0dGUoZGFya190ZXh0LCAiZ29fbGlnaHRlciIsIG5fY29sb3VycyA9IDUpWzJdCiAgbGlnaHRfdGV4dCA8LSAgbW9ub2Nocm9tZVI6OmdlbmVyYXRlX3BhbGV0dGUoZGFya190ZXh0LCAiZ29fbGlnaHRlciIsIG5fY29sb3VycyA9IDUpWzNdCiAgCiAgdGhlbWVfYncoYmFzZV9mYW1pbHk9InNhbnMiKSAlK3JlcGxhY2UlIAogICAgdGhlbWUoCiAgICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgIHBhbmVsLmJhY2tncm91bmQgID0gZWxlbWVudF9yZWN0KGZpbGw9InRyYW5zcGFyZW50IiwgY29sb3VyPU5BKSwgCiAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksIAogICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksCiAgICAgIGxlZ2VuZC5rZXkgPSBlbGVtZW50X3JlY3QoZmlsbD0idHJhbnNwYXJlbnQiLCBjb2xvdXI9TkEpLAogICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG91ciA9IG1pZF90ZXh0LCBsaW5laGVpZ2h0ID0gMS4xKSwKICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSBiYXNlX3NpemUpLAogICAgICB0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gYmFzZV9zaXplICogMS41LAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBkYXJrX3RleHQpLAogICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGJhc2Vfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IG1pZF90ZXh0KSwKICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSBiYXNlX3NpemUgKiAxLjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSB1bml0KGMoMywgMCwgMCwgMCksICJtbSIpKSwKICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSBiYXNlX3NpemUgKiAxLjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSB1bml0KGMoMCwgNSwgMCwgMCksICJtbSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZ2xlID0gOTApLAogICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPWJhc2Vfc2l6ZSAqIDAuOSksCiAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gYmFzZV9zaXplICogMC45LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UgPSAiYm9sZCIpLAogICAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbigwLjI1LCAwLjI1LCAwLjI1LCAwLjI1LCJjbSIpCiAgICApCn0KYGBgCgojIyBTaXRlIE1hcAoKYGBge3Igc2FtcGxlZC1zaXRlcywgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTZ9CmNvb3JkcyA9IHNpdGVfZGF0YSAlPiUKICBkcGx5cjo6c2VsZWN0KHNpdGUsIGxvbmcsIGxhdCwgY29sbGVjdGlvbl90ZW1wKSAlPiUKICBkcm9wX25hKGNvbGxlY3Rpb25fdGVtcCkgJT4lIAogIGRpc3RpbmN0KCkgIyA8MT4KCm1hcF9kYXRhKCJ3b3JsZCIpICU+JSAKICBmaWx0ZXIocmVnaW9uICVpbiUgYygiVVNBIiwgIkNhbmFkYSIpKSAlPiUgCiAgZ2dwbG90KCkgKyAKICBnZW9tX3BvbHlnb24oYWVzKHggPSBsb25nLCB5ID0gbGF0LCBncm91cCA9IGdyb3VwKSwKICAgICAgICAgICAgICAgZmlsbCA9ICJsaWdodGdyZXkiKSArIAogIGNvb3JkX21hcCh4bGltID0gYygtMTEwLC02MCksCiAgICAgICAgICAgIHlsaW0gPSBjKDI1LCA1NSkpICsgCiAgZ2VvbV9wb2ludChkYXRhID0gY29vcmRzLAogICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gbG9uZywgeSA9IGxhdCwgY29sb3VyID0gY29sbGVjdGlvbl90ZW1wKSwKICAgICAgICAgICAgIHNpemUgPSAzKSArCiAgc2NhbGVfY29sb3VyX3ZpcmlkaXNfYyhvcHRpb24gPSAiRiIpICsgCiAgbGFicyh4ID0gIkxvbmdpdHVkZSIsIAogICAgICAgeSA9ICJMYXRpdHVkZSIsCiAgICAgICBjb2xvdXIgPSAiVGVtcC4iKSArIAogIHRoZW1lX21hdHQoKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpCmBgYAoKMS4gVGVzdCBjb21tZW50CgojIyBDVG1heCBEYXRhIAoKYGBge3IgZmlnLndpZHRoPTIwLCBmaWcuaGVpZ2h0PTZ9CmN0bWF4X3RlbXBfcGxvdCA9IGN0bWF4X2RhdGEgJT4lIAogIG11dGF0ZShzcGVjaWVzID0gc3RyX3JlcGxhY2Uoc3BlY2llcywgIl8iLCAiICIpLAogICAgICAgICBzcGVjaWVzID0gc3RyX3RvX3NlbnRlbmNlKHNwZWNpZXMpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gY29sbGVjdGlvbl90ZW1wLCB5ID0gY3RtYXgpKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG91ciA9ICJibGFjayIpICsgCiAgZ2VvbV9wb2ludChhZXMoY29sb3VyID0gc3BlY2llcykpICsgCiAgbGFicyh4ID0gIkNvbGxlY3Rpb24gVGVtcC4gKMKwQykiLCAKICAgICAgIHkgPSAiQ1RtYXggKMKwQykiKSArIAogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gc2tpc3RvX2NvbHMpICsgCiAgdGhlbWVfbWF0dCgpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikKCmN0bWF4X2xhdF9wbG90ID0gY3RtYXhfZGF0YSAlPiUgCiAgbXV0YXRlKHNwZWNpZXMgPSBzdHJfcmVwbGFjZShzcGVjaWVzLCAiXyIsICIgIiksCiAgICAgICAgIHNwZWNpZXMgPSBzdHJfdG9fc2VudGVuY2Uoc3BlY2llcykpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBsYXQsIHkgPSBjdG1heCkpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3VyID0gImJsYWNrIikgKyAKICBnZW9tX3BvaW50KGFlcyhjb2xvdXIgPSBzcGVjaWVzKSkgKyAKICBsYWJzKHggPSAiTGF0aXR1ZGUiLCAKICAgICAgIHkgPSAiQ1RtYXggKMKwQykiKSArIAogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gc2tpc3RvX2NvbHMpICsgCiAgdGhlbWVfbWF0dCgpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikKCmN0bWF4X2VsZXZfcGxvdCA9IGN0bWF4X2RhdGEgJT4lIAogIG11dGF0ZShzcGVjaWVzID0gc3RyX3JlcGxhY2Uoc3BlY2llcywgIl8iLCAiICIpLAogICAgICAgICBzcGVjaWVzID0gc3RyX3RvX3NlbnRlbmNlKHNwZWNpZXMpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gZWxldmF0aW9uLCB5ID0gY3RtYXgpKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG91ciA9ICJibGFjayIpICsgCiAgZ2VvbV9wb2ludChhZXMoY29sb3VyID0gc3BlY2llcykpICsKICBsYWJzKHggPSAiRWxldmF0aW9uIChtKSIsIAogICAgICAgeSA9ICJDVG1heCAowrBDKSIpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IHNraXN0b19jb2xzKSArIAogIHRoZW1lX21hdHQoKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpCgpnZ3B1YnI6OmdnYXJyYW5nZShjdG1heF90ZW1wX3Bsb3QsIGN0bWF4X2xhdF9wbG90LCBjdG1heF9lbGV2X3Bsb3QsIGNvbW1vbi5sZWdlbmQgPSBULCBsZWdlbmQgPSAicmlnaHQiLCBucm93ID0gMSkKYGBgCgoKYGBge3IgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9CmN0bWF4X2RhdGEgJT4lIAogIG11dGF0ZShzcGVjaWVzID0gc3RyX3JlcGxhY2Uoc3BlY2llcywgIl8iLCAiICIpLAogICAgICAgICBzcGVjaWVzID0gc3RyX3RvX3NlbnRlbmNlKHNwZWNpZXMpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gY29sbGVjdGlvbl90ZW1wLCB5ID0gY3RtYXgpKSArIAogIGZhY2V0X3dyYXAoc3BlY2llc34uKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG91ciA9ICJibGFjayIpICsgCiAgZ2VvbV9wb2ludCgpICsgCiAgbGFicyh4ID0gIkNvbGxlY3Rpb24gVGVtcC4gKMKwQykiLAogICAgICAgeSA9ICJDVG1heCAowrBDKSIpICsgCiAgdGhlbWVfbWF0dCgpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpgYGAKCmBgYHtyIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD02fQpjdG1heF9kYXRhICU+JSAKICBmaWx0ZXIoc3RyX2RldGVjdChzcGVjaWVzLCBwYXR0ZXJuID0gInNraXN0byIpIHwgCiAgICAgICAgICAgc3RyX2RldGVjdChzcGVjaWVzLCBwYXR0ZXJuID0gImxlcHRvIikgfCAKICAgICAgICAgICBzdHJfZGV0ZWN0KHNwZWNpZXMsIHBhdHRlcm4gPSAiYWdsYW8iKSkgJT4lIAogIG11dGF0ZShzcGVjaWVzID0gc3RyX3JlcGxhY2Uoc3BlY2llcywgIl8iLCAiICIpLAogICAgICAgICBzcGVjaWVzID0gc3RyX3RvX3NlbnRlbmNlKHNwZWNpZXMpKSAlPiUgCiAgZ3JvdXBfYnkoY29sbGVjdGlvbl9kYXRlLCBzcGVjaWVzLCBjb2xsZWN0aW9uX3RlbXApICU+JSAKICBzdW1tYXJpc2UobWVhbl9jdG1heCA9IG1lYW4oY3RtYXgpLAogICAgICAgICAgICBjdG1heF9zZCA9IHNkKGN0bWF4KSwKICAgICAgICAgICAgY3RtYXhfbiA9IG4oKSwgCiAgICAgICAgICAgIGN0bWF4X3NlID0gY3RtYXhfc2QgLyBzcXJ0KGN0bWF4X24pKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gY29sbGVjdGlvbl90ZW1wLCB5ID0gbWVhbl9jdG1heCwgY29sb3VyID0gc3BlY2llcykpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2U9RiwgbGluZXdpZHRoID0gMikgKyAKICBnZW9tX3BvaW50KHNpemUgPSAyKSArIAogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBtZWFuX2N0bWF4IC0gY3RtYXhfc2UsIAogICAgICAgICAgICAgICAgICAgIHltYXggPSBtZWFuX2N0bWF4ICsgY3RtYXhfc2UpLAogICAgICAgICAgICAgICAgd2lkdGggPSAwLjMsIGxpbmV3aWR0aCA9IDEpICsgCiAgbGFicyh4ID0gIkNvbGxlY3Rpb24gVGVtcC4gKMKwQykiLAogICAgICAgeSA9ICJDVG1heCAowrBDKSIpICsgCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBza2lzdG9fY29scykgKyAKICB0aGVtZV9tYXR0KCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKQpgYGAKCmBgYHtyIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQpjdG1heF9kYXRhICU+JSAKICBtdXRhdGUoc3BlY2llcyA9IHN0cl9yZXBsYWNlKHNwZWNpZXMsICJfIiwgIiAiKSwKICAgICAgICAgc3BlY2llcyA9IHN0cl90b19zZW50ZW5jZShzcGVjaWVzKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IGNvbGxlY3Rpb25fdGVtcCwgeSA9IHNpemUpKSArIAogIGZhY2V0X3dyYXAoc3BlY2llc34uKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG91ciA9ICJibGFjayIpICsgCiAgZ2VvbV9wb2ludCgpICsgCiAgbGFicyh4ID0gIkNvbGxlY3Rpb24gVGVtcC4gKMKwQykiLAogICAgICAgeSA9ICJQcm9zb21lIExlbmd0aCAobW0pIikgKyAKICB0aGVtZV9tYXR0KCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCmBgYAoKYGBge3IgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9CmN0bWF4X2RhdGEgJT4lIAogIG11dGF0ZShzcGVjaWVzID0gc3RyX3JlcGxhY2Uoc3BlY2llcywgIl8iLCAiICIpLAogICAgICAgICBzcGVjaWVzID0gc3RyX3RvX3NlbnRlbmNlKHNwZWNpZXMpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gY29sbGVjdGlvbl90ZW1wLCB5ID0gZWdnX3ZvbHVtZSkpICsgCiAgZmFjZXRfd3JhcChzcGVjaWVzfi4pICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3VyID0gImJsYWNrIikgKyAKICBnZW9tX3BvaW50KCkgKyAKICBsYWJzKHggPSAiQ29sbGVjdGlvbiBUZW1wLiAowrBDKSIsCiAgICAgICB5ID0gIkVnZyBWb2x1bWUgKG1tXjMpIikgKyAKICB0aGVtZV9tYXR0KCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCmBgYAoKYGBge3J9CmN0bWF4X2RhdGEgJT4lIAogIHNlbGVjdChlbGV2YXRpb24sIGNvbGxlY3Rpb25fdGVtcCkgJT4lIAogIGRpc3RpbmN0KCkgJT4lIAogIGdncGxvdChhZXMoeCA9IGVsZXZhdGlvbiwgeSA9IGNvbGxlY3Rpb25fdGVtcCkpICsgCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGxhYnMoeCA9ICJFbGV2YXRpb24gKG0pIiwgCiAgICAgICB5ID0gIkNvbGxlY3Rpb24gVGVtcC4gKMKwQykiKSArIAogIHRoZW1lX21hdHQoKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoY3RtYXhfZGF0YSwgYWVzKHggPSBzaXplLCB5ID0gY3RtYXgsIGNvbG91ciA9IHNwZWNpZXMpKSArIAogIGZhY2V0X3dyYXAoLn5zcGVjaWVzKSArIAogIGdlb21fcG9pbnQoKSArIAogIHRoZW1lX21hdHQoKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKCmdncGxvdChjdG1heF9kYXRhLCBhZXMoeCA9IHNpemUsIHkgPSBmZWN1bmRpdHksIGNvbG91ciA9IHNwZWNpZXMpKSArIAogIGZhY2V0X3dyYXAoLn5zcGVjaWVzKSArIAogIGdlb21fcG9pbnQoKSArIAogIHRoZW1lX21hdHQoKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKYGBgCgpgYGB7cn0KZ2dwbG90KGN0bWF4X2RhdGEsIGFlcyh4ID0gc2l6ZSwgeSA9IHRvdGFsX2VnZ192b2x1bWUpKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGZvcm11bGEgPSB5IH4gZXhwKHgpKSArIAogIGdlb21fcG9pbnQoKSsKICBsYWJzKHggPSAiUHJvc29tZSBMZW5ndGggKG1tKSIsCiAgICAgICB5ID0gIlRvdGFsIEVnZyBWb2x1bWUgKG1tXjMpIikgKyAKICB0aGVtZV9tYXR0KCkKCmdncGxvdChjdG1heF9kYXRhLCBhZXMoeCA9IHNpemUsIHkgPSB0b3RhbF9lZ2dfdm9sdW1lKSkgKyAKICBmYWNldF93cmFwKC5+c3BlY2llcykgKyAKICBnZW9tX3BvaW50KCkrCiAgI2dlb21fc21vb3RoKCkgKyAKICBsYWJzKHggPSAiUHJvc29tZSBMZW5ndGggKG1tKSIsCiAgICAgICB5ID0gIlRvdGFsIEVnZyBWb2x1bWUgKG1tXjMpIikgKyAKICB0aGVtZV9tYXR0KCkKCmBgYAoKYGBge3IgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9Nn0KY3RtYXhfZGF0YSAlPiUgCiAgZmlsdGVyKHNwZWNpZXMgPT0gInNraXN0b2RpYXB0b211c19wYWxsaWR1cyIpICU+JQogICMgZ3JvdXBfYnkoc2l0ZSkgJT4lIAogICMgc3VtbWFyaXNlKHNpemUgPSBtZWFuKHNpemUsIG5hLnJtID0gVCksIAogICMgICAgICAgICAgdG90YWxfZWdnX3ZvbHVtZSA9IG1lYW4odG90YWxfZWdnX3ZvbHVtZSwgbmEucm0gPSBUKSkgJT4lIApnZ3Bsb3QoYWVzKHggPSBzaXplLCB5ID0gdG90YWxfZWdnX3ZvbHVtZSkpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgZm9ybXVsYSA9IHkgfiBleHAoeCksIAogICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpICsgCiAgZ2VvbV9wb2ludChhZXMoY29sb3VyID0gc2l0ZSkpKwogIGxhYnMoeCA9ICJQcm9zb21lIExlbmd0aCAobW0pIiwKICAgICAgIHkgPSAiVG90YWwgRWdnIFZvbHVtZSAobW1eMykiKSArIAogIHRoZW1lX21hdHQoKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpCmBgYAoKCmBgYHtyfQptb2RlbF9kYXRhID0gY3RtYXhfZGF0YSAlPiUgCiAgbXV0YXRlKCJnZW51cyIgPSBzdHJfc3BsaXRfZml4ZWQoc3BlY2llcywgcGF0dGVybiA9ICJfIiwgbiA9IDIpWywxXSwKICAgICAgICAgZ2VudXMgPSB0b29sczo6dG9UaXRsZUNhc2UoZ2VudXMpLAogICAgICAgICAiZG95IiA9IHlkYXkoY29sbGVjdGlvbl9kYXRlKSkgJT4lIAogIHNlbGVjdChzaXRlLCBjb2xsZWN0aW9uX2RhdGUsIGRveSwgY29sbGVjdGlvbl90ZW1wLCBsYXQsIGVsZXZhdGlvbiwgc3BlY2llcywgZ2VudXMsIHNhbXBsZV9pZCwgZmVjdW5kaXR5LCB0b3RhbF9lZ2dfdm9sdW1lLCBzaXplLCBjdG1heCkgJT4lIAogIGZpbHRlcihnZW51cyAhPSAiTUgiKSAlPiUgIAogIG11dGF0ZSh0b3RhbF9lZ2dfdm9sdW1lID0gaWZfZWxzZShpcy5uYSh0b3RhbF9lZ2dfdm9sdW1lKSwgMCwgdG90YWxfZWdnX3ZvbHVtZSksCiAgICAgICAgIGNvbGxlY3Rpb25fdGVtcF9zYyA9IHNjYWxlKGNvbGxlY3Rpb25fdGVtcCksCiAgICAgICAgIGxhdF9zYyA9IHNjYWxlKGxhdCksIAogICAgICAgICBlbGV2YXRpb25fc2MgPSBzY2FsZShlbGV2YXRpb24pLAogICAgICAgICB0ZXZfc2MgPSBzY2FsZSh0b3RhbF9lZ2dfdm9sdW1lKSkgCgpjdG1heF90ZW1wLm1vZGVsID0gbG0oZGF0YSA9IG1vZGVsX2RhdGEsIAogICAgICAgICAgICAgICAgICAgICAgY3RtYXggfiBnZW51cyArIGNvbGxlY3Rpb25fdGVtcCArIGxhdCArIGVsZXZhdGlvbiArIHRvdGFsX2VnZ192b2x1bWUpCgojTXVNSW46OmRyZWRnZShjdG1heF90ZW1wLm1vZGVsKQoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKGN0bWF4X3RlbXAubW9kZWwpCiAKc3VtbWFyeShjdG1heF90ZW1wLm1vZGVsKQoKZW1tZWFuczo6ZW1tZWFucyhjdG1heF90ZW1wLm1vZGVsLCBzcGVjcyA9ICJnZW51cyIpICU+JSAKICBkYXRhLmZyYW1lKCkgJT4lIAogIG11dGF0ZShnZW51cyA9IGZjdF9yZW9yZGVyKGdlbnVzLCAueCA9IGVtbWVhbiwgLmRlc2MgPSBUKSkgJT4lIAogIGdncGxvdChhZXMoZ2VudXMsIHkgPSBlbW1lYW4pKSArIAogIGdlb21fcG9pbnQoc2l6ZSA9IDQpICsgCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IGVtbWVhbiAtIFNFLCB5bWF4ID0gZW1tZWFuICsgU0UpLCAKICAgICAgICAgICAgICAgIHdpZHRoID0gMC4yLCBsaW5ld2lkdGggPSAxKSArIAogIGxhYnMoeCA9ICIiKSArIAogIHRoZW1lX21hdHQoKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMzAwLCBoanVzdCA9IDAsIHZqdXN0ID0gMC41KSkKCmBgYAoKCmBgYHtyIGZlY3VuZGl0eS1yaWRnZXMsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTh9CmN0bWF4X2RhdGEgJT4lIAogIG11dGF0ZShncm91cF9pZCA9IHBhc3RlKHNpdGUsIHNwZWNpZXMpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gZmVjdW5kaXR5LCB5ID0gc2l0ZSwgZmlsbCA9IHNpdGUpKSArIAogIGdlb21fZGVuc2l0eV9yaWRnZXMoYmFuZHdpZHRoID0gMiwKICAgICAgICAgICAgICAgICAgICAgIGppdHRlcmVkX3BvaW50cyA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2hhcGUgPSAyMSwKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemUgPSAxLAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfY29sb3VyID0gImdyZXkzMCIsCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDAuNiwKICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gMC45LAogICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9wb2ludHNfaml0dGVyKAogICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSAwLjEsIHdpZHRoID0gMCkpICsgCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Qob3B0aW9uID0gIkUiLCBkaXJlY3Rpb24gPSAtMSkgKyAKICB0aGVtZV9tYXR0KCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCmBgYAoKYGBge3Igc2l6ZS1yaWRnZXMsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTh9CmN0bWF4X2RhdGEgJT4lIAogIG11dGF0ZShncm91cF9pZCA9IHBhc3RlKHNpdGUsIHNwZWNpZXMpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gc2l6ZSwgeSA9IHNpdGUsIGZpbGwgPSBzaXRlLCBncm91cCA9IGdyb3VwX2lkKSkgKyAKICBnZW9tX2RlbnNpdHlfcmlkZ2VzKGJhbmR3aWR0aCA9IDAuMDIsCiAgICAgICAgICAgICAgICAgICAgICBqaXR0ZXJlZF9wb2ludHMgPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NoYXBlID0gMjEsCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gMSwKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2NvbG91ciA9ICJncmV5MzAiLAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAwLjYsCiAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuOSwKICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fcG9pbnRzX2ppdHRlcigKICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gMC4xLCB3aWR0aCA9IDApKSArIAogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG9wdGlvbiA9ICJFIiwgZGlyZWN0aW9uID0gLTEpICsgCiAgdGhlbWVfbWF0dCgpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpgYGAKCmBgYHtyIGN0bWF4LXJpZGdlcywgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9OH0KY3RtYXhfZGF0YSAlPiUgCiAgbXV0YXRlKGdyb3VwX2lkID0gcGFzdGUoc2l0ZSwgc3BlY2llcykpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBjdG1heCwgeSA9IHNpdGUsIGZpbGwgPSBzaXRlLCBncm91cCA9IGdyb3VwX2lkKSkgKyAKICBnZW9tX2RlbnNpdHlfcmlkZ2VzKGJhbmR3aWR0aCA9IDAuMywKICAgICAgICAgICAgICAgICAgICAgIGppdHRlcmVkX3BvaW50cyA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2hhcGUgPSAyMSwKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemUgPSAxLAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfY29sb3VyID0gImdyZXkzMCIsCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDAuNiwKICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gMC45LAogICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9wb2ludHNfaml0dGVyKAogICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSAwLjEsIHdpZHRoID0gMCkpICsgCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Qob3B0aW9uID0gIkUiLCBkaXJlY3Rpb24gPSAtMSkgKyAKICBsYWJzKHggPSAiQ1RtYXggKMKwQykiKSArIAogIHRoZW1lX21hdHQoKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKYGBgCg==